package es.us.master.ejb;

import es.us.master.entity.Tarea;
import es.us.master.entity.Usuario;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
public class TareaFacade extends AbstractFacade<Tarea> implements TareaFacadeLocal {
    @PersistenceContext(unitName = "GestorTareas-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public TareaFacade() {
        super(Tarea.class);
    }
    
    @Override
    public List<Tarea> findAllOwn(Usuario usuario) {
        Query query = em.createNamedQuery("Tarea.findAllOwn").
                setParameter("usuario", usuario);
        
        return (List<Tarea>) query.getResultList();
    }

    @Override
    public List<Tarea> findAllInvited(Usuario usuario) {
        Query query = em.createNamedQuery("Tarea.findAllInvited").
                setParameter("usuario", usuario);
        
        return (List<Tarea>) query.getResultList();
    }

    @Override
    public List<Tarea> findAllOthers(Usuario usuario) {
        Query query = em.createNamedQuery("Tarea.findAllOthers").
                setParameter("usuario", usuario);
        
        return (List<Tarea>) query.getResultList();
    }

    @Override
    public Tarea findByIdTarea(Integer idTarea) {
        Tarea res = null;
        Query query = em.createNamedQuery("Tarea.findByIdTarea").
                setParameter("idTarea", idTarea);
        
        try {
            res = (Tarea) query.getSingleResult();
        } catch(NoResultException e) {
        }
        
        return res;
    }

    @Override
    public List<Tarea> findByNombre(String nombre) {
        Query query = em.createNamedQuery("Tarea.findByNombre").
                setParameter("nombre", "%" + nombre + "%");
        
        return (List<Tarea>) query.getResultList();
    }

    @Override
    public List<Tarea> findByDescripcion(String descripcion) {
        Query query = em.createNamedQuery("Tarea.findByDescripcion").
                setParameter("descripcion", "%" + descripcion + "%");
        
        return (List<Tarea>) query.getResultList();
    }

    @Override
    public List<Tarea> findByEstado(String estado) {
        Query query = em.createNamedQuery("Tarea.findByEstado").
                setParameter("estado", estado);
        
        return (List<Tarea>) query.getResultList();
    }

    @Override
    public List<Tarea> findByFechaIni(Date fechaIni) {
        Query query = em.createNamedQuery("Tarea.findByFechaIni").
                setParameter("fechaIni", fechaIni);
        
        return (List<Tarea>) query.getResultList();
    }

    @Override
    public List<Tarea> findByFechaFin(Date fechaFin) {
        Query query = em.createNamedQuery("Tarea.findByFechaFin").
                setParameter("fechaFin", fechaFin);
        
        return (List<Tarea>) query.getResultList();
    }

    @Override
    public List<Tarea> findBetweenFechaIniAndFechaFin(Date fechaIni, Date fechaFin) {
        Query query = em.createNamedQuery("Tarea.findBetweenFechaIniAndFechaFin").
                setParameter("fechaIni", fechaIni).
                setParameter("fechaFin", fechaFin);
        
        return (List<Tarea>) query.getResultList();
    }
}
